<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>数据比较</title>
  </head>

  <body></body>
  <script>
    var array = ["白鸽", "麻雀", "鱼", "大象", "狗", "鸡"];
    //             B      M       Y     D      G     J
    // 排序为：     B      D       G     J      M     Y
    // sort（）本身也是可以实现排序的，但是sort是按照ASCII编码大小来比较字符串的，所以有时我们在单独使用sort()方法来对数组排序时可能得不到我们想要的顺序
    // console.log(array.sort());
    array = array.sort((item1, item2) => {
      console.log(item1, item2);
      // 一些非英语语言的字符串需要使用 String.localeCompare。这个函数可以将函数排序到正确的顺序。
      // localeCompare()是在JavaScript的一个内置函数，可以用于比较任何两个特定的顺序元素，来实现中文按照拼音排序
      // localeCompare(用来比较的字符串) 方法返回一个数字来指示一个参考字符串是否在排序顺序前面或之后或与给定字符串相同。
      // 返回值  如果引用字符存在于比较字符之前则为负数; 如果引用字符存在于比较字符之后则为正数; 相等的时候返回 0 .
      // 如果 compareFunction(a, b) 小于 0 ，那么 a 会被排列到 b 之前
      console.log(item1.localeCompare(item2));
      return item1.localeCompare(item2);
    });
    console.log(array);
    //["白鸽", "大象", "狗", "鸡", "麻雀", "鱼"]

    var arr = [1, 2, 3, "a", "k", "b", "d", 10, 20, "c"];
    arr.sort(function (a, b) {
      // isFinite() 判断a、b是否是数字。
      var c = isFinite(a), // 如果 number 是有限数字（或可转换为有限数字），那么返回 true。
        // 否则，如果 number 是 NaN（非数字），或者是正、负无穷大的数，则返回 false。
        d = isFinite(b);
      // c != d 说明如果c和d不相等，也就是说比较的值不是同一类型。那就比较 d-c 的值是1还是-1
      // 如果c == d 也就是说c、d是同一类型的值，c、d可能都是字母，也可能都是数字。
      // 如果都是数字，这里就可以直接比较大小了，如果都是字母的话，就可以使用 localeCompare 比较了。
      return (c != d && d - c) || (c && d ? a - b : a.localeCompare(b));
    });
    console.log(arr);
    //[1, 2, 3, 10, 20, "a", "b", "c", "d", "k"]

    a = "n".localeCompare("z");
    console.log(a); // -1
    b = "gfg".localeCompare("geeksforgeeks");
    console.log(b); // 1
    c = "a".localeCompare("a");
    console.log(c); // 0
  </script>
</html>
